﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Jogo_Grupo2.Cenas;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Jogo_Grupo2.Elementos;
//using Jogo_Grupo2.Elementos;

namespace Jogo_Grupo2.Telas
{
    class Level:CenaBase
    {

        public static Level instancia;

        Player garota;
        Cabana cabana;
        Hud coracao;
        Barricada barricada;
        Barricada barricada2;
        float danoBarricadaRecebido;
        float danoBarricadaRecebido2;
        float danoCabanaRecebido;
        public static int chao = 250;

        int contador;
        PowerUp powerUp;


        List<Inimigo> ListaInimigos;
        public List<PowerUp> ListaPowerUps;
        public List<int> RandomPu;
        
        //inimigos vindo da esquerda
        List<Monstro> ListaMonstro;

        Random random = new Random();
        SpriteFont sfont;

        KeyboardState teclado;
        Pontucao pontuacao;
        SpriteEffects inverted = SpriteEffects.None;
        int randomI = 0; //random.Next(1, 5);

        enum Wave
        {
            Wave1,
            Wave2,
            Final,
        }

        Wave waveAtual;
        int waveCounter = 3600;

        SpriteFont segoe, tempoWave;

        public override void start()
        {
            instancia = this;

            waveAtual = Wave.Wave1;

            segoe = Game1.instancia.Content.Load<SpriteFont>("spritefonte");
            tempoWave = Game1.instancia.Content.Load<SpriteFont>("spritefonte");

            ListaInimigos = new List<Inimigo>();
            ListaMonstro = new List<Monstro>();
            ListaPowerUps = new List<PowerUp>();

            cabana = new Cabana(Game1.instancia.Content.Load<Texture2D>("refens"), new Vector2(400, chao+50));
            garota = new Player(Game1.instancia.Content.Load<Texture2D>("teste"), new Vector2(300, chao+70));
            coracao = new Hud(Game1.instancia.Content.Load<Texture2D>("coracao"), new Vector2(130, 0));
            pontuacao = new Pontucao();
            barricada = new Barricada(Game1.instancia.Content.Load<Texture2D>("barricada"), new Vector2(600, chao+80), SpriteEffects.None);
            barricada2 = new Barricada(Game1.instancia.Content.Load<Texture2D>("barricada"),new Vector2(250, chao+100),SpriteEffects.FlipVertically);

            powerUp = new PowerUp(Game1.instancia.Content.Load<Texture2D>(@"PowerUps\SemPu"),new Vector2(455,19));
            
           
        }

        private void colisaoTiro()
        {
            for (int t = 0; t < garota.ListaTiros.Count(); t++) 
            {
                for (int i = 0; i < ListaInimigos.Count(); i++)
                {
                    if (garota.ListaTiros[t].collisionBox().Intersects(ListaInimigos[i].collisionBox()))
                    {
                        garota.ListaTiros.RemoveAt(t);
                        ListaInimigos.RemoveAt(i);
                        pontuacao.ganharPontos(1);
                        break;
                    }
                }
            }

            for (int t = 0; t < garota.ListaTiros.Count(); t++)
            {
                for (int m = 0; m < ListaMonstro.Count(); m++)
                {
                    if (garota.ListaTiros[t].collisionBox().Intersects(ListaMonstro[m].collisionBox()))
                    {
                        ListaMonstro[m].perderVida(1);
                        garota.ListaTiros.RemoveAt(t);

                        if (ListaMonstro[m].morreu)
                        {
                            ListaMonstro.RemoveAt(m);
                            pontuacao.ganharPontos(5);
                        }
                        break;
                    }
                }
            }
        }
        private void colisaoBazuca()
        {
            for (int b = 0; b < garota.ListaBazuca.Count(); b++)
            {
                for (int i = 0; i < ListaInimigos.Count(); i++)
                {
                    if (garota.ListaBazuca[b].collisionBox().Intersects(ListaInimigos[i].collisionBox()))
                    {
                        garota.ListaBazuca.RemoveAt(b);
                        ListaInimigos.RemoveAt(i);
                        pontuacao.ganharPontos(1);
                        break;
                    }
                }
            }

            for (int b = 0; b < garota.ListaBazuca.Count(); b++)
            {
                for (int m = 0; m < ListaMonstro.Count(); m++)
                {
                    if (garota.ListaBazuca[b].collisionBox().Intersects(ListaMonstro[m].collisionBox()))
                    {
                        garota.ListaBazuca.RemoveAt(b);
                        ListaMonstro.RemoveAt(m);
                        pontuacao.ganharPontos(5);
                        break;
                    }
                }
            }
        }
        private void ColisaoMetranca()
        {
            for (int i = 0; i < garota.ListaMetranca.Count(); i++)
            {
                for (int b = 0; b < ListaInimigos.Count(); b++)
                {
                    if (garota.ListaMetranca[i].collisionBox().Intersects(ListaInimigos[b].collisionBox()))
                    {
                        garota.ListaMetranca.RemoveAt(i);
                        ListaInimigos.RemoveAt(b);
                        pontuacao.ganharPontos(1);
                        break;
                    }
                }
            }

            for (int i = 0; i < garota.ListaMetranca.Count(); i++)
            {
                for (int m = 0; m < ListaMonstro.Count(); m++)
                {
                    if (garota.ListaMetranca[i].collisionBox().Intersects(ListaMonstro[m].collisionBox()))
                    {
                        garota.ListaMetranca.RemoveAt(i);
                        ListaMonstro.RemoveAt(m);
                        pontuacao.ganharPontos(5);
                        break;
                    }
                }
            }

        }      
        private void colisaoGarotaInimigo()
        {
            for (int i = 0; i < ListaInimigos.Count(); i++)
            {
                if (garota.collisionBox().Intersects(ListaInimigos[i].collisionBox()) && Math.Abs(garota.position.X - ListaInimigos[i].position.X) <= 50)
                {
                    garota.perderVida(1);

                    if (garota.morreu)
                    {
                        Console.WriteLine("colidiu"); 
                    }
                }
                break;
            }

            for (int i = 0; i < ListaMonstro.Count(); i++)
            {
                if (garota.collisionBox().Intersects(ListaMonstro[i].collisionBox()) && Math.Abs(garota.position.X - ListaMonstro[i].position.X) <= 50)
                {
                    garota.perderVida(2);
                    if (garota.morreu)
                    {
                        Console.WriteLine("colidiuMonstro");
                    }
                }
                break;
            }

        }
        private void colisaoGarotaBarricada()
        {   
            if (barricada != null && garota != null)
            {
                if (garota.collisionBox().Intersects(barricada.collisionBox()) && garota.collisionBox().Left <= barricada.position.X)
                    
                {
                    //Console.WriteLine("O player colidiu com a barreira");
                  
                    //garota.position.X = barricada.collisionBox().Left-barricada.collisionBox().Width;
                    garota.position.X = barricada.position.X  - garota.spriteRect.Width;
                }
            }
            if (barricada2 != null && garota != null)
            {
                if (garota.collisionBox().Intersects(barricada2.collisionBox()) && barricada2.collisionBox().Left >= garota.position.X)
                {
                   // Console.WriteLine("O player colidiu com a barreira2");

                    garota.position.X = barricada2.collisionBox().Left;// +barricada2.collisionBox().Width;
                }


            }
        }
        private void colisaoInimigoCabana()
        {
            for (int i = 0; i < ListaInimigos.Count; i++)
            {
                if (cabana != null && ListaInimigos[i] != null)
                {
                    if (ListaInimigos[i].collisionBox().Intersects(cabana.collisionBox()) && ListaInimigos[i].position.X <= cabana.collisionBox().Right - 55 && ListaInimigos[i].position.X > cabana.collisionBox().Center.X)
                    {
                        ListaInimigos[i].position.X = cabana.collisionBox().Right - 55;
                        cabana.perdeEnergiaCabana();
                        cabana.invulneravel = false;
                        danoCabanaRecebido = ListaInimigos[i].AtaqueInimigo();
                        if (danoCabanaRecebido > cabana.energiaCabana)
                        {
                            cabana.verificarDestruiuCabana();
                            cabana = null;
                            Game1.instancia.Exit();
                        }
                    }
                }
                if (cabana != null && ListaInimigos[i] != null)
                {
                    if (ListaInimigos[i].collisionBox().Intersects(cabana.collisionBox()) && ListaInimigos[i].position.X >= cabana.collisionBox().Left - 85 && ListaInimigos[i].position.X < cabana.collisionBox().Center.X)
                    {
                        ListaInimigos[i].position.X = cabana.collisionBox().Left - 85;
                        cabana.perdeEnergiaCabana();
                        cabana.invulneravel = false;
                        danoBarricadaRecebido = ListaInimigos[i].AtaqueInimigo();
                        if (danoCabanaRecebido > cabana.energiaCabana)
                        {
                            cabana.verificarDestruiuCabana();
                            cabana = null;
                        }
                    }
                }
            }

            for (int i = 0; i < ListaMonstro.Count; i++)
            {
                if (cabana != null && ListaMonstro[i] != null)
                {
                    if (ListaMonstro[i].collisionBox().Intersects(cabana.collisionBox()) && ListaMonstro[i].position.X <= cabana.collisionBox().Right - 55 && ListaMonstro[i].position.X > cabana.collisionBox().Center.X)
                    {
                        ListaMonstro[i].position.X = cabana.collisionBox().Right - 55;
                        cabana.perdeEnergiaCabana();
                        cabana.invulneravel = false;
                        danoCabanaRecebido = ListaMonstro[i].AtaqueInimigo();
                        if (danoCabanaRecebido > cabana.energiaCabana)
                        {
                            cabana.verificarDestruiuCabana();
                            cabana=  null;

                        }
                    }
                }
            }

        }
        private void colisaoInimigoBarricada()
        {
            for (int i = 0; i < ListaInimigos.Count; i++)
            {

                if (barricada != null && ListaInimigos[i] != null)
                {
                    if (ListaInimigos[i].collisionBox().Intersects(barricada.collisionBox()) && ListaInimigos[i].position.X <= barricada.collisionBox().Left)
                    {
                        ListaInimigos[i].position.X = barricada.collisionBox().Left + barricada.spriteWidth;

                        //if(barricada.verificarDestruiu() == false)    
                        barricada.perderEnergiaBarricada();
                        barricada.invulneravel = false;
                        danoBarricadaRecebido = ListaInimigos[i].AtaqueInimigo();
                        if (danoBarricadaRecebido > barricada.energia)
                        {
                            //ListaInimigos[i].AtaqueInimigo();
                            //barricada.perderEnergia();
                            barricada.verificarDestruiuBarricada();
                            barricada = null;

                        }


                    }
                }

                for (int u = 0; u < ListaMonstro.Count; u++)
                {
                    if (barricada != null && ListaMonstro[u] != null)
                    {
                        if (ListaMonstro[u].collisionBox().Intersects(barricada.collisionBox()) && ListaMonstro[u].position.X <= barricada.collisionBox().Left)
                        {
                            ListaMonstro[u].position.X = barricada.collisionBox().Left + barricada.spriteWidth;
                            barricada.perderEnergiaBarricada();
                            barricada.invulneravel = false;
                            //danoBarricadaRecebido = ListaMonstro[u]
                            if (danoBarricadaRecebido > barricada.energia)
                            {
                                barricada.verificarDestruiuBarricada();
                                barricada = null;
                            }
                        }
                    }
                }

                    if (barricada2 != null && ListaInimigos[i] != null)
                    {
                        if (ListaInimigos[i].collisionBox().Intersects(barricada2.collisionBox()) && ListaInimigos[i].position.X <= barricada2.collisionBox().Left)
                        {
                            ListaInimigos[i].position.X = barricada2.collisionBox().Left - 100;
                            {
                                barricada2.perderEnergiaBarricada();
                                barricada2.invulneravel = false;
                                danoBarricadaRecebido2 = ListaInimigos[i].AtaqueInimigo();
                                if (danoBarricadaRecebido2 > barricada2.energia)
                                {
                                    barricada2.verificarDestruiuBarricada();
                                    barricada2 = null;
                                }
                            }
                        }

                    }

                }
            }
        public void ColisaoGarotaPowerUp()
        {
            if (garota.collisionBox().Intersects(powerUp.collisionBox()))
            {
                //powerUp=

            }
        }
        public void GanharPowerUp()
        {
            teclado = Keyboard.GetState();
            if ((teclado.IsKeyDown(Keys.U) && (powerUp != null)))
            {
                powerUp.SelectPu();
  
            }
        }
        private void verifyWaves()
        {
            if(waveAtual != Wave.Final)
            waveCounter--;

            if (waveCounter < 0)
            {
                if (waveAtual == Wave.Wave2)
                {
                    waveAtual = Wave.Final;
                    waveCounter = 0; 
                }

                else
                {
                    waveCounter = 7200;
                    waveAtual = Wave.Wave2;
                }
            }


            
        }


        private void adicionarInimigo()
        {
            if (waveAtual == Wave.Wave1)
            {
                Inimigo zumbi;
                contador++;
                int randomN = random.Next(3, 5);
                int randomDirection = random.Next(0, 2);

                if (contador >= 60 && ListaInimigos.Count < randomN)
                {
                    contador = 0;
                    int randomX = random.Next(900, 1000);

                    if (randomDirection == 0)
                    {
                        zumbi = new Inimigo(Game1.instancia.Content.Load<Texture2D>("zumbi2"), new Vector2(randomX, 300), SpriteEffects.None);
                    }

                    else
                    {
                        zumbi = new Inimigo(Game1.instancia.Content.Load<Texture2D>("zumbi2"), new Vector2(-200, 300), SpriteEffects.FlipHorizontally);
                    }



                    ListaInimigos.Add(zumbi);
                }
            }

            else if (waveAtual == Wave.Wave2)
            {
                Inimigo zumbi;
                contador++;
                int randomN = random.Next(10, 10);
                int randomDirection = random.Next(0, 4);

                if (contador >= 60 && ListaInimigos.Count < randomN)
                {
                    contador = 0;
                    int randomX = random.Next(900, 1000);

                    if (randomDirection == 0)
                    {
                        zumbi = new Inimigo(Game1.instancia.Content.Load<Texture2D>("zumbi"), new Vector2(randomX, 300), SpriteEffects.None);
                    }

                    else
                    {
                        zumbi = new Inimigo(Game1.instancia.Content.Load<Texture2D>("zumbi"), new Vector2(-200, 300), SpriteEffects.FlipHorizontally);
                    }



                    ListaInimigos.Add(zumbi);
                }

            }

            
        }
        private void adicionarMonstro()
        {
            if (waveAtual == Wave.Wave1)
            {
                Monstro monstro;
                contador++;
                int randomN = random.Next(1, 2);
                int randomDirection = random.Next(0, 4);

                if (contador >= 60 && ListaMonstro.Count < randomN)
                {
                    contador = 0;
                    int randomX = random.Next(1800, 2800);

                    if (randomDirection == 0)
                    {
                        monstro = new Monstro(Game1.instancia.Content.Load<Texture2D>("monstro1d"), new Vector2(randomX, 300), SpriteEffects.None);
                    }

                    else
                    {
                        monstro = new Monstro(Game1.instancia.Content.Load<Texture2D>("monstro1d"), new Vector2(-200, 300), SpriteEffects.FlipHorizontally);
                    }

                    ListaMonstro.Add(monstro);
                }
            }

            else if (waveAtual == Wave.Wave2)

            {
                Monstro monstro;
                contador++;
                int randomN = random.Next(3, 5);
                int randomDirection = random.Next(0, 2);

                if (contador >= 60 && ListaMonstro.Count < randomN)
                {
                    contador = 0;
                    int randomX = random.Next(1800, 2000);

                    if (randomDirection == 0)
                    {
                        monstro = new Monstro(Game1.instancia.Content.Load<Texture2D>("monstro1d"), new Vector2(randomX, 300), SpriteEffects.None);
                    }

                    else
                    {
                        monstro = new Monstro(Game1.instancia.Content.Load<Texture2D>("monstro1d"), new Vector2(-200, 300), SpriteEffects.FlipHorizontally);
                    }

                    ListaMonstro.Add(monstro);
                }

            }
        }
        private void adicionarPu()
        {
            for (int i = 0; i < ListaPowerUps.Count(); i++)
            {
                RandomPu.Add(randomI);

            }
        }
        private void GanhaPu()
        {
            if (ListaPowerUps != null)
            {
                for (int i = 0; i < ListaPowerUps.Count; i++)
                {
                    //if( )
                    {

                    }


                }

            }
            GanharPowerUp();
        }
       
        public override void update(GameTime gameTime)
        {
            colisaoInimigoCabana();
            //cabana.Update(gameTime);
            garota.Update(gameTime);
            adicionarInimigo();
            pontuacao.Update(gameTime);
            teclado = Keyboard.GetState();
            for (int i = 0; i < ListaInimigos.Count(); i++)
            {
                ListaInimigos[i].Update(gameTime);
            }

            for (int b = 0; b < ListaMonstro.Count(); b++)
            {
                ListaMonstro[b].Update(gameTime);
            }

            if(teclado.IsKeyDown(Keys.Escape))
            {
                Game1.instancia.Exit();
            }
            
            colisaoTiro();
            colisaoGarotaInimigo();
            colisaoGarotaBarricada();
            //colisaoInimigoBarricadaEsquerda();
            colisaoInimigoBarricada();
            colisaoBazuca();
            ColisaoMetranca();
            adicionarMonstro();
            if (barricada != null && barricada.verificarDestruiuBarricada())
            {
                barricada = null;
            }
            if (barricada2 != null && barricada2.verificarDestruiuBarricada())
            {
                barricada2 = null;
            }
            if (cabana != null && cabana.verificarDestruiuCabana())
            {
                cabana = null;
            }
            powerUp.Update(gameTime);
            
            if (ListaPowerUps.Count() == 0)
            {
                adicionarPu();
            }

            verifyWaves();

            ////
            garota.verifyUpgrades(ListaPowerUps);
            powerUp.Update(gameTime);
        }
        public override void draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(Game1.instancia.Content.Load<Texture2D>("LevelBackground"), new Rectangle(0, 0, 1000, 480), Color.White);
            spriteBatch.Draw(Game1.instancia.Content.Load<Texture2D>("PowerUps/caixaPu1"),new Vector2(450,15),Color.White);
            spriteBatch.Draw(Game1.instancia.Content.Load<Texture2D>("cabin1"), new Vector2(390, chao - 50), Color.White);
            if (cabana != null) { cabana.Draw(spriteBatch); }
            for (int i = 0; i < ListaInimigos.Count(); i++)
            {
                ListaInimigos[i].Draw(spriteBatch);
            }

            for (int b = 0; b < ListaMonstro.Count(); b++)
            {
                ListaMonstro[b].Draw(spriteBatch);
            }
                        
            pontuacao.Draw(spriteBatch);

            
            spriteBatch.Draw(Game1.instancia.Content.Load<Texture2D>("heart"), new Vector2(-45, 0), Color.White);

            coracao.Draw(spriteBatch);
            spriteBatch.DrawString(segoe, "x " + garota.vida.ToString(), new Vector2(200, 0), Color.White);
            spriteBatch.DrawString(segoe, "Wave " + waveCounter.ToString(), new Vector2(700, 0), Color.White);
          
            if (garota != null) { garota.Draw(spriteBatch); }
            if (barricada != null){ barricada.Draw(spriteBatch);}               
            if (barricada2 != null){ barricada2.Draw(spriteBatch);}

            powerUp.Draw(spriteBatch);
            
            //spriteBatch.DrawString(sfont,"Tecle ESC para sair", new Vector2(50, 800), Color.Orange);

        }
        public override void terminate()
        {
            
        }

    }
}
